package com.sz.biz.logistics.bill.service;

import com.sz.common.base.dto.CommonModel;
import com.sz.common.base.dto.QResultDto;
import com.sz.common.base.dto.QueryParams;
import com.sz.biz.logistics.bill.entity.Billing;
import com.sz.biz.logistics.bill.entity.BillingStatus;
import com.sz.biz.logistics.bill.dto.BillingGenerateDto;
import com.sz.biz.logistics.bill.dto.BillingListStringCustomerDto;
import com.sz.biz.logistics.bill.dto.BillingTaskDto;
import com.sz.biz.logistics.bill.dto.BillingUrlDto;

import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * Function: 账单服务 <br>
 * Author: jifeixing <br>
 * Date: 2017-05-17 14:09:00
 */

public interface BillingService {

    /**
     * 生成账单
     *
     * @param billingTaskDto
     */
    void generateBill(BillingTaskDto billingTaskDto);

    /**
     * 数据交换账单接口
     * @param billNo
     * @param orderNo
     * @param customerId
     * @param startEffectTime
     * @param endEffectTime
     * @return
     */
    List<BillingListStringCustomerDto> billsForEDI(String billNo, String orderNo, Integer customerId, Date startEffectTime, Date endEffectTime,String type);

    /**
     * 账单列表
     *
     * @param params
     * @return
     */
    QResultDto findByFilter(QueryParams params);

    /**
     * 账单列表-客户平台
     * @param q
     * @param billNo
     * @param orderNo
     * @param customerId
     * @param status
     * @param includeAllAudit
     * @param startEffectTime
     * @param endEffectTime
     * @param pageIndex
     * @param pageSize
     * @param sort
     * @param asc
     * @return
     */
    QResultDto findByFilterForCustomer(String q, String billNo, String orderNo, Integer customerId, BillingStatus status, boolean includeAllAudit, String startEffectTime, String endEffectTime, int pageIndex, int pageSize, String sort, Boolean asc,String type);

    /**
     * 批量删除账单信息
     *
     * @param billingNos
     */
    void batchdeleteByNos(List<String> billingNos,String type, List<Integer> suppliers);

    /**
     * 批量删除账单信息-客户平台
     * 只能删除已付款的账单
     *
     * @param billingNos
     */
    void batchdeleteByNosCustomer(List<String> billingNos,String type, List<Integer> suppliers);

    /**
     * 提交审核
     *
     * @param billNos
     */
    void submit(List<String> billNos,String type);

    /**
     * 审核账单
     * @param map
     * @return
     */
    BillingStatus audit(Map<String, Object> map,String billType);

    /**
     * 价格调整
     *
     * @param billingDto
     */
    void adjustment(Map<String, String> billingDto,String type);

    /**
     * 所有账单状态
     * @param isAudit
     * @return
     */
    List<CommonModel> getBillingStatus(String isAudit);

    /**
     * 所有账单状态-客户平台
     * @return
     */
    List<CommonModel> getBillingStatusForCustomer();

    /**
     * 转换时间
     * @param timeString
     * @return
     */
    Date populateTime(String timeString);

    /**
     * 根据账单号获取账单信息
     * @param billNo
     * @return
     */
    Billing findByBillNo(String billNo,String type);

    /**
     * 所有的价格调整类型
     * @return
     */
    List<CommonModel> getAdjustmentType();

    /**
     * 重新生成账单
     * @param taskCode
     * @param customerId
     * @param startEffectTime
     * @param endEffectTime
     */
    void regenerate(String taskCode, Integer customerId, Date startEffectTime, Date endEffectTime,String type);

    /**
     * 根据任务编码删除账单
     * @param taskCodes
     */
    void batchDeleteByTaskCodes(List<String> taskCodes,String type);

    /**
     * 已付款
     * @param billNos
     */
    void paid(List<String> billNos,String type);

    /**
     * 导出账单
     * @param billNos
     * @return
     */
    List<BillingUrlDto> export(List<String> billNos,String type);

    /**
     * 导出账单-客户平台
     * @param billNos
     * @return
     */
    List<BillingUrlDto> exportCustomer(List<String> billNos,String type);

    /**
     * 获取时间段内所有订单信息
     * @param billingTaskDto
     * @param isBilled
     * @return
     */
    List<BillingGenerateDto> getOrderByCustomerIdAndCreateTime(BillingTaskDto billingTaskDto, boolean isBilled);

    /**
     * 客户平台账单刘流转，已出帐，已付款，逾期未结
     * @param billNo
     * @return
     */
    List<Map<String,String>> findFinancialApprovals(String billNo);
}
